ARKitRemoteが使いづらかったのでA-npanRemoteというのを作った


概要

発音は[あ~んぱんリモート]。


リポジトリはこれ

https://github.com/sassembla/A-npanRemote

名前にハイフンが使えて大満足。Unity内でも問題なかった。

由来はARです。イニシャルが。



原因

Unity標準のARKitRemoteの、接続をする、ボタンを押す、動作する、、、みたいなのが本当に最悪の体験だった。

なんか切れたり落ちたりするし、接続自体に失敗するみたいなのまである。これではダメだ。こんなダメな体験で人生を無駄にしてはいけない。



ということで目指したのは以下


・エディタ上でARKitを使うコードを書いたら自動的にARKitサーバが立ち上がるようにする

・ARKitを動かすiOSアプリ側からいつでも、何回でも接続、再接続できる

・無線で接続できる。


構造

まず、iOS ARKit実行機からはUnity Editorに接続することにした。

これはまあ、エディタで動いてる時しか使わんでしょみたいな感じ。


接続にはWebSocketを使う。そのため、iOS側にはWSクライアント、エディタにはWSサーバが立つ。


概念的に書くとこんな感じ

iOS ARkit -ws-> Unity Editor


WSサーバは結構軽量なんで、ユーザーがエディタのPlayを押したら起動、Stopを押したら落とす、みたいな感じにした。




次にPlay中にARKitを使うところまできたら &&  iOS ARKitからのインプットが来ていたら、自動的にiOS ARKitのインプットをPlay中のアプリに流し込みたかった。

で、エディタとPlay中のアプリの接続には、やっぱりWebSocketを使った。


概念的に書くとこんな感じ2

iOS ARkit -ws-> Unity Editor <-ws- Player

面白くなってきやがったぜ。


最終的なデータフローとしては、上記を実装した上で、iOS -> Editorで中継してPlayerに流し込む という単純なものになっている。

この構造ならiOS側が切断しようがPlayer側が切断しようが、どちらかが復帰したタイミングでデータを流せる。



展望

現状はただARKitについて動くだけなんで、今後はOculus Questの視界とかコントローラとかをUnity Editorにほうり込めるようにする。

WebSocketサーバで自前のやつがあったんだけど権利の関係でちょっと改修が必要で、現在はFleckというMITライセンスのライブラリに依存している。


MSの用意してるWebSocketサーバのAPI実装はリクエストヘッダ付きのモバイルからの通信に対してちゃんと動作しなかったので無視する。出来が悪い。

みんなSocketを使って実装してるぞ。ハイレベルなAPIなんか使い物にならないから使われてないぞ。俺も使ってないが。君はどうだ。